package com.qingzhou.web.controller.common;

import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.qingzhou.common.web.controller.BaseController;
import com.qingzhou.common.web.domain.PageData;
import com.qingzhou.gen.domain.GenTable;
import com.qingzhou.gen.service.IGenTableService;
import org.noear.solon.annotation.*;
import org.noear.solon.auth.annotation.AuthPermissions;
import org.noear.solon.core.handle.Result;
import org.noear.solon.data.annotation.Tran;
import org.noear.solon.validation.annotation.Validated;

import java.util.List;
import java.util.Map;

/**
 * 代码生成 操作处理
 * @author xm
 */
@Controller
@Mapping("gen/table")
public class GenTableController extends BaseController {

    @Inject
    IGenTableService genTableService;

    /**
     * 查询数据库列表
     */
    @AuthPermissions("gen:table:list")
    @Get
    @Mapping("tables")
    public PageData tables(Page<GenTable> page, GenTable genTable) {
        startPage(page);
        List<GenTable> list = genTableService.tables(genTable);
        return getPageData(list);
    }

    /**
     * 查询代码生成列表
     */
    @AuthPermissions("gen:table:list")
    @Get
    @Mapping("list")
    public PageData list(Page<GenTable> page, GenTable genTable) {
        QueryWrapper qw = QueryWrapper.create();
        qw.and(GenTable::getTableName).like(genTable.getTableName());
        qw.and(GenTable::getTableComment).like(genTable.getTableComment());
        Page<GenTable> result = genTableService.page(page, qw);
        return getPageData(result);
    }

    /**
     * 查询代码生成详情
     */
    @AuthPermissions("gen:table:query")
    @Get
    @Mapping("{tableId}")
    public Map<String, Object> info(@Path Long tableId) {
        return genTableService.info(tableId);
    }

    /**
     * 预览代码生成
     */
    @AuthPermissions("gen:table:preview")
    @Get
    @Mapping("preview/{tableId}")
    public Map<String, String> preview(@Path Long tableId) {
        return genTableService.preview(tableId);
    }

    /**
     * 新增代码生成（导入表）
     */
    @AuthPermissions("gen:table:add")
    @Tran
    @Post
    @Mapping
    public Result add(String tables) {
        genTableService.add(tables);
        return Result.succeed();
    }

    /**
     * 修改代码生成
     */
    @AuthPermissions("gen:table:edit")
    @Tran
    @Put
    @Mapping
    public Result edit(@Body @Validated GenTable genTable) {
        return toResult(genTableService.edit(genTable));
    }

    /**
     * 删除代码生成
     */
    @AuthPermissions("gen:table:remove")
    @Tran
    @Delete
    @Mapping("{tableIds}")
    public Result delete(@Path Long[] tableIds) {
        genTableService.delete(tableIds);
        return Result.succeed();
    }

    /**
     * 同步数据库
     */
    @AuthPermissions("gen:table:edit")
    @Get
    @Mapping("synchDb/{tableName}")
    public Result synchDb(@Path String tableName) {
        genTableService.synchDb(tableName);
        return Result.succeed();
    }

    /**
     * 生成代码（自定义路径）
     */
    @AuthPermissions("gen:table:code")
    @Get
    @Mapping("genCode/{tableName}")
    public Result genCode(@Path String tableName) {
        genTableService.genCode(tableName);
        return Result.succeed();
    }

    /**
     * 批量生成代码
     */
    @AuthPermissions("gen:table:code")
    @Get
    @Mapping("batchGenCode")
    public void batchGenCode(String tables) {
        genTableService.batchGenCode(tables);
    }

}
